package cn.group01.git.service.impl;

import cn.group01.git.common.CodeMsg;
import cn.group01.git.common.ResponseResult;
import cn.group01.git.dto.TemplatePage;
import cn.group01.git.entity.Template;
import cn.group01.git.mapper.TemplateMapper;
import cn.group01.git.service.TemplateService;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.lang.UUID;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.util.Date;
import java.util.List;

// 模板
@Service
public class TemplateServiceImpl implements TemplateService {

    @Autowired
    private TemplateMapper templateMapper;

    /*
    * 上传文件
    *   1、文件保存到磁盘中
    *         保证文件名不重复  用到了uuid
    *   2、文件信息保存到数据库用户前端页面的回显
    * */
    public ResponseResult upload(MultipartFile file) {
        // 判断前端有没有传输文件
        if (file.isEmpty()){
            return ResponseResult.fail(CodeMsg.ERROR);
        }

        /*
        * 上传了之后 1、保存到磁盘中
        *       1、拿到文件名（解决中文乱码的问题）
        *       2、取得文件扩展名
        *       3、生成一个uuid
        *       4、拼接uuid和扩展得到一个新的文件名   传到路径中
        * */
        String originalFilename = file.getOriginalFilename();

        try {
            // 解决中文乱码
            byte[] bytes = originalFilename.getBytes("ISO8859-1");
            originalFilename = new String(bytes, "UTF-8");

            // 取得文件扩展名  这里不包含.
            String filenameExtension = StringUtils.getFilenameExtension(originalFilename);
            // 生成uuid  本来生成uuid 是xxxx-xxxx-xx这种类型
            String uuid = UUID.randomUUID().toString().replace("-", "");
            // 拼接uuid和扩展名
            String uuidName = uuid+"."+filenameExtension;

            File file1 = new File("D:\\upload\\"+uuidName);
            // 上传文件，括号内是文件存储位置
            file.transferTo(file1);

            // 2、向数据库中添加文件信息
            Template template = new Template();
            template.setCreateTime(new Date());
            // stripFilenameExtension去除文件名的后缀 这里我们不希望存储文件名时再存储扩展名
            template.setFileName(StringUtils.stripFilenameExtension(originalFilename));
            template.setUuidName(uuidName);
            // 疑问1
            double size = file.getSize()/1024;
            template.setSize(size);
            // 添加模板
            templateMapper.addTemplate(template);
            return ResponseResult.success(CodeMsg.SUCCESS);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    // 模板的回显
    public ResponseResult getList(TemplatePage templatePage) {
        // 开启分页
        PageHelper.startPage(templatePage.getPage(), templatePage.getLimit());
        List<Template> templates = templateMapper.getList(templatePage.getFileName());
        PageInfo<Template> te = new PageInfo<Template>(templates);
        long total = te.getTotal();
        return ResponseResult.success(CodeMsg.SUCCESS, templates, total);
    }

    // 下载文件
    public void download(String fileName, HttpServletResponse response) {

        try {
            FileInputStream fileInputStream = new FileInputStream("D:\\upload\\" + fileName);
            //  设置响应的格式  以附件形式打开
            response.setContentType("application/force-download");// 设置强制下载不打开
            response.addHeader("Content-Disposition", "attachment;fileName=" + fileName );// 设置文件名
            ServletOutputStream outputStream = response.getOutputStream();
            IoUtil.copy(fileInputStream, outputStream);

            outputStream.close();
            fileInputStream.close();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}
